#include <stdio.h>
#include <string.h>
#include <stdlib.h>

long long func(long long n)
{
    if (n == 1)
        return 0;
    if (n == 2)
        return 1;
    return (n - 1) * (func(n - 2) + func(n - 1));
}

int main()
{
    // 2 1
    // 3 3 123 312 213 231
    // 4 12  1234 2143 4123 3124 3142 12
    // n! / 2
    long long i = 0;
    scanf("%lld", &i);
    printf("%lld\n", func(i));
    return 0;
}

// #include <vector>
// #include <iostream>

// int main()
// {
//     std::vector<int> a;
//     int tmp = 0;
//     while (1)
//     {
//         scanf("%d", &tmp);
//         if (tmp < 0)
//             break;
//         a.push_back(tmp);
//     }
//     scanf("%d", &tmp);
//     for (auto i = a.begin(); i < a.end(); ++i)
//     {
//         if (*i <= tmp)
//             std::cout << *i << " ";
//     }
//     std::cout << std::endl;
//     return 0;
// }

// int compare(const void *a, const void *b)
// {
//     return *(int *)a < *(int *)b;
// }
// int main()
// {
//     char str[10001] = {0};
//     while (scanf("%s", &str) != EOF)
//     {
//         int nums[26] = {0};
//         for (int i = 0; i < strlen(str); ++i)
//         {
//             if (str[i] <= 'Z')
//                 nums[str[i] - 'A'] += 1;
//             else if (str[i] <= 'z')
//                 nums[str[i] - 'a'] += 1;
//         }
//         qsort(nums, 26, sizeof(int), compare);
//         int result = 0;
//         for (int i = 0; i < 26; ++i)
//         {
//             result += (26 - i) * nums[i];
//         }
//         printf("%d\n", result);
//     }
//     return 0;
// }

// int main()
// {
//     int A[10][10] = {0};
//     int m = 0;
//     int n = 0;
//     while (scanf("%d %d", &m, &n) != EOF)
//     {
//         for (int i = 0; i < m; ++i)
//         {
//             for (int j = 0; j < n; ++j)
//                 scanf("%d", &A[i][j]);
//         }
//         int tmp = 0;
//         for (int i = 0; i < m; ++i)
//         {
//             for (int j = 0; j < n; ++j)
//             {
//                 scanf("%d", &tmp);
//                 A[i][j] += tmp;
//             }
//         }
//         for (int i = 0; i < m; ++i)
//         {
//             for (int j = 0; j < n; ++j)
//             {
//                 printf("%d ", A[i][j]);
//             }
//             printf("\n");
//         }
//     }
//     return 0;
// }

// int main()
// {
//     int M = 0;
//     int N = 0;
//     scanf("%d %d", &M, &N);
//     // 得到其最大公因数
//     int left = M - N;
//     int right = M + N;
//     int max = left * right;
//     int tmp = left;
//     while (right % left != 0)
//     {
//         tmp = left;
//         left = right % left;
//         right = tmp;
//     }
//     printf("%d\n", max / left);
//     return 0;
// }
// int main()
// {
//     int N = 0;
//     scanf("%d", &N);
//     int result = 0;
//     for (int i = 1; i <= N; ++i)
//         if (i % 2 == 0 || i % 3 == 0 || i % 5 == 0)
//             ++result;
//     printf("%d\n", result);
//     return 0;
// }
// int main()
// {

//     int a = 0;
//     int b = 0;
//     scanf("%d %d", &a, &b);
//     if (a + b >= 0 && a + b <= 3)
//         printf("YES\n");
//     else if (a + b >= 4)
//         printf("NO\n");
//     else if (a + b < 0)
//         printf("negative\n");
//     return 0;
// }

// int main()
// {
//     printf("        *\n        **\n*       ***\n**      ****\n****************\n**      ****\n*       ***\n        **\n        *\n");
//     return 0;
// }
// int func1(char *str)
// {
//     printf("****%s****\n", str);
//     return 0;
// }

// int func2(char *str)
// {
//     printf("--------------------------------\n");
//     printf("|%20s|\n", str);
//     printf("--------------------------------\n");
//     return 0;
// }

// int main()
// {
//     int (*ptr)(char *str) = func1;
//     char str[] = "2021331200076 庞超";
//     ptr(str);
//     ptr = func2;
//     ptr(str);

//     return 0;
// }
